package com.base.cn.platform.os.common.mybatis;

import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.*;

import java.math.BigDecimal;
import java.util.List;

public interface BaseDao<E> {
    /**
     * 单条记录添加
     * @param e 记录数据对象
     * @param tableName  表名
     */
//    @Options(useGeneratedKeys = true,keyProperty = "entity.id", keyColumn = "id")
    @InsertProvider(type = BaseInsertProvider.class,method = "saveTableName")
    void saveTableName(@Param("entity") E e,@Param("tableName") String tableName);

    /**
     * 单条记录添加
     * @param e 记录数据对象
     */
//    @Options(useGeneratedKeys = true,keyProperty = "entity.id", keyColumn = "id")
    @InsertProvider(type = BaseInsertProvider.class,method = "save")
    void save(@Param("clazz") Class clazz, @Param("entity") E e);

    /**
     * 批量添加
     * @param list 数据列表
     * @param tableName 表名
     */
//    @Options(useGeneratedKeys = true, keyColumn = "id")
    @InsertProvider(type = BaseInsertProvider.class,method = "batchSaveTableName")
    void batchSaveTableName(@Param("list") List<E> list,@Param("tableName") String tableName);

    /**
     * 批量添加
     * @param list 数据列表
     */
//    @Options(useGeneratedKeys = true, keyColumn = "id")
    @InsertProvider(type = BaseInsertProvider.class,method = "batchSave")
    void batchSave(@Param("clazz") Class clazz, @Param("list") List<E> list);
    /**
     * 修改数据
     * @param e 修改数据对象
     */
    @UpdateProvider(type = BaseUpdateProvider.class,method = "updateByIdTableName")
    void updateByIdTableName(@Param("entity") E e,
                             @Param("idName") String idName,
                             @Param("tableName") String tableName);

    /**
     * 修改数据
     * @param e 修改数据对象
     */
    @UpdateProvider(type = BaseUpdateProvider.class,method = "updateById")
    void updateById(@Param("clazz") Class clazz, @Param("entity") E e, @Param("idName") String idName);

    /**
     * 条件修改
     * @param e 修改数据对象
     * @param whereSql 修改条件
     */
    @UpdateProvider(type = BaseUpdateProvider.class,method = "updateByTableNameWhereSql")
    void updateByTableNameWhereSql(@Param("entity") E e, @Param("whereSql") String whereSql,@Param("tableName") String tableName);

    /**
     * 条件修改
     * @param e 修改数据对象
     * @param whereSql 修改条件
     */
    @UpdateProvider(type = BaseUpdateProvider.class,method = "updateByWhereSql")
    void updateByWhereSql(@Param("clazz") Class clazz, @Param("entity") E e, @Param("whereSql") String whereSql);

    /**
     * 批量更新
     * @param entityList
     * @param tableName
     */
    @UpdateProvider(type =BaseUpdateProvider.class ,method = "updateBatchSqlTableName")
    void updateBatchTableName(@Param("list") List<E> entityList,
                              @Param("tableName") String tableName);

    /**
     * 批量更新
     * @param entityList
     */
    @UpdateProvider(type =BaseUpdateProvider.class ,method = "updateBatchSql")
    void updateBatch(@Param("clazz") Class clazz, @Param("list") List<E> entityList);

    /**
     * 通过ID删除
     * @param clazz 实体类的Class
     * @param id ID
     * @param tableName 表名
     */
    @DeleteProvider(type = BaseDeleteProvider.class,method = "deleteByIdTableName")
    void deleteByIdTableName(@Param("clazz") Class clazz,
                             @Param("id") BigDecimal id,
                             @Param("tableName") String tableName);

    /**
     * 通过ID删除
     * @param clazz 实体类的Class
     * @param id ID
     */
    @DeleteProvider(type = BaseDeleteProvider.class,method = "deleteById")
    void deleteById(@Param("clazz") Class clazz, @Param("id") BigDecimal id);

    /**
     * 批量删除
     * @param clazz 实体类的Class
     * @param whereSql 删除条件
     * @param tableName 表名
     */
    @DeleteProvider(type = BaseDeleteProvider.class,method = "deleteWhereSqlTableName")
    void deleteWhereSqlTableName(@Param("clazz") Class clazz,
                                 @Param("whereSql") String whereSql,
                                 @Param("tableName") String tableName);

    /**
     * 批量删除
     * @param clazz 实体类的Class
     * @param whereSql 删除条件
     */
    @DeleteProvider(type = BaseDeleteProvider.class,method = "deleteWhereSql")
    void deleteWhereSql(@Param("clazz") Class clazz, @Param("whereSql") String whereSql);

    /**
     * 通过ID查询数据
     * @param clazz 实体类的Class
     * @param id  查询的ID
     * @param tableName 表名
     * @return 数据对象
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findByIdTableName")
    E findByIdTableName(@Param("clazz") Class clazz, @Param("id") BigDecimal id,
                        @Param("tableName") String tableName);

    /**
     * 通过ID查询数据
     * @param clazz 实体类的Class
     * @param id  查询的ID
     * @return 数据对象
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findById")
    E findById(@Param("clazz") Class clazz, @Param("id") BigDecimal id);

    /**
     * 通过ID查询数据
     * @param clazz 实体类的Class
     * @param id 查询的ID
     * @param containColumns 只查询的列
     * @param tableName 表名
     * @return 数据对象
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findByIdContainTableName")
    E findByIdContainTableName(@Param("clazz") Class clazz, @Param("id") BigDecimal id,
                               @Param("containColumns") List<String> containColumns,
                               @Param("tableName") String tableName);

    /**
     * 通过ID查询数据
     * @param clazz 实体类的Class
     * @param id 查询的ID
     * @param containColumns 只查询的列
     * @return 数据对象
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findByIdContain")
    E findByIdContain(@Param("clazz") Class clazz, @Param("id") BigDecimal id, @Param("containColumns") List<String> containColumns);

    /**
     * 条件查询
     * @param clazz  实体类的Class
     * @param whereSql 查询条件
     * @param count 查询量
     * @param containColumns 要查询的列表，不填写查询所有的列
     * @return 数据列表
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findWhereSqlTableName")
    List<E> findTableName(@Param("clazz") Class clazz,
                          @Param("whereSql") String whereSql,
                          @Param("tableName") String tableName,
                          @Param("count") Integer count,
                          @Param("containColumns") List<String> containColumns);

    /**
     * 条件查询
     * @param clazz  实体类的Class
     * @param whereSql 查询条件
     * @param count 查询量
     * @param containColumns 要查询的列表，不填写查询所有的列
     * @return 数据列表
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findWhereSql")
    List<E> find(@Param("clazz") Class clazz,
                 @Param("whereSql") String whereSql,
                 @Param("count") Integer count,
                 @Param("containColumns") List<String> containColumns);

    /**
     * 条件查询
     * @param clazz  实体类的Class
     * @param whereSql 查询条件
     * @param containColumns 要查询的列表，不填写查询所有的列
     * @return 数据列表
     */
    @SelectProvider(type = BaseSelectProvider.class,method = "findPage")
    Page<E> findPage(@Param("clazz") Class clazz,
                     @Param("whereSql") String whereSql,
                     @Param("containColumns") List<String> containColumns);

    /**
     * 查询数量
     * @param entityClass 实体类的Class
     * @param whereSql 查询条件
     * @return 记录量
     */
    @SelectProvider(type = BaseSelectProvider.class, method = "count")
    @ResultType(BigDecimal.class)
    <T> BigDecimal count(@Param("clazz") Class<T> entityClass, @Param("whereSql") String whereSql);

    /**
     * sum查询
     * @param entityClass
     * @param sumColumn 查询总量的列名
     * @param whereSql 查询条件
     * @param <T>
     * @return
     */
    @SelectProvider(type = BaseSelectProvider.class, method = "sum")
    @ResultType(BigDecimal.class)
    <T> BigDecimal sum(@Param("clazz") Class<T> entityClass,
                       @Param("sumColumn") String sumColumn,
                       @Param("whereSql") String whereSql);

}
